﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Entidades;
using System.Data.OracleClient;
using System.Data;
using System.Configuration;

namespace Datos
{
    public class PacienteAD
    {
        public static Paciente GetByRut(string Rut)
        {
            string sql = @"select PACIENTE.NOMBRE as NOMBRE,
	                              PACIENTE.APELLIDO as APELLIDO,
	                              PACIENTE.SEXO as SEXO,
	                              PACIENTE.TELEFONO as TELEFONO,
	                              PACIENTE.DIRECCION as DIRECCION ,
	                              PACIENTE.MAIL as MAIL,
	                              PACIENTE.CELULAR as CELULAR,
	                              PACIENTE.FECHANACIMIENTO as FECHANACIMIENTO,
	                              PACIENTE.HABITOS as HABITOS,
	                              PACIENTE.OBSERVACIONES as OBSERVACIONES,
	                              PACIENTE.TRATAMIENTOSPREVIOS as TRATAMIENTOSPREVIOS,
	                              PACIENTE.NOMBREREPRESENTANTE as NOMBREREPRESENTANTE,
	                              PACIENTE.RUTREPRESENTANTE as RUTREPRESENTANTE,
	                              PACIENTE.ESTADO as ESTADO,
	                              PACIENTE.RUTPACIENTE as RUTPACIENTE
                             from  PACIENTE where PACIENTE.RUTPACIENTE = " + Rut;

            Paciente paciente = null;


            OracleConnection Oraclecon = new OracleConnection("Server=XE;Uid=juan;Pwd=lagartija");
            Oraclecon.Open();
            OracleCommand myCMD = new OracleCommand();
            myCMD.Connection = Oraclecon;
            myCMD.CommandText = sql;
            myCMD.CommandType = CommandType.Text;

            OracleDataReader reader = myCMD.ExecuteReader();


            if (reader.Read())
            {
                paciente = LoadPaciente(reader);
            }

            Oraclecon.Close();
            return paciente;
         
        }

        private static Paciente LoadPaciente(IDataReader reader)
        {
            Paciente paciente = new Paciente();

            paciente.rut = Convert.ToString(reader["rutpaciente"]);
            paciente.nombre = Convert.ToString(reader["nombre"]);
            paciente.apellidos = Convert.ToString(reader["apellido"]);
            paciente.sexo = Convert.ToString(reader["sexo"]);
            paciente.telefono = Convert.ToInt32(reader["telefono"]);
            paciente.direccion = Convert.ToString(reader["direccion"]);
            paciente.mail = Convert.ToString(reader["mail"]);
            paciente.celular = Convert.ToInt32(reader["celular"]);
            paciente.fechaNacimiento = Convert.ToString(reader["fechanacimiento"]);
            paciente.habitos = Convert.ToString(reader["habitos"]);
            paciente.observaciones = Convert.ToString(reader["observaciones"]);
            paciente.tratamientosPrevios = Convert.ToString(reader["tratamientosprevios"]);
            paciente.nombreRepresentante = Convert.ToString(reader["nombrerepresentante"]);
            paciente.rutRepresentante = Convert.ToString(reader["rutrepresentante"]);
            paciente.estado = Convert.ToString(reader["estado"]);

            return paciente;
        }

        public static int NuevoPaciente(Paciente paciente)
        {
            OracleConnection oraConn = new OracleConnection();
            int k = 0;
            string connString = "Server=XE;Uid=juan;Pwd=lagartija";
            if (oraConn.State != ConnectionState.Open)
            {
                try
                {
                    oraConn.ConnectionString = connString;

                    oraConn.Open();

                    Console.WriteLine(oraConn.ConnectionString, "Successful Connection");
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message, "Exception Caught");
                }
            }

            if (oraConn.State == ConnectionState.Open)
            {
                string sqlInsert = "insert into paciente (RUTPACIENTE,NOMBRE,APELLIDO,SEXO,TELEFONO,DIRECCION,MAIL,CELULAR,FECHANACIMIENTO,HABITOS,OBSERVACIONES,TRATAMIENTOSPREVIOS,NOMBREREPRESENTANTE,RUTREPRESENTANTE,ESTADO)";
                sqlInsert += "values (:p_rut, :p_nombre, :p_apellidos, :p_sexo, :p_telefono, :P_direccion, :p_mail, :p_celular, :p_fechanacimiento, :p_habitos, :p_observaciones, :p_tratamientos, :p_nombreRep, :p_RutRep, :p_Estado)";
                
                OracleCommand cmdInsert = new OracleCommand();
                cmdInsert.CommandText = sqlInsert;
                cmdInsert.Connection = oraConn;

                OracleParameter pRut = new OracleParameter();
                pRut.Value = paciente.rut;
                pRut.ParameterName = "p_rut";

                OracleParameter pNombre = new OracleParameter();
                pNombre.Value = paciente.nombre;
                pNombre.ParameterName = "p_nombre";

                OracleParameter pApellidos = new OracleParameter();
                pApellidos.Value = paciente.apellidos;
                pApellidos.ParameterName = "p_apellidos";

                OracleParameter pSexo = new OracleParameter();
                pSexo.Value = paciente.sexo;
                pSexo.ParameterName = "p_sexo";

                OracleParameter pTelefono = new OracleParameter();
                
                pTelefono.DbType = DbType.Int32;
                pTelefono.Value = paciente.telefono;
                pTelefono.ParameterName = "p_telefono";

                OracleParameter pDireccion = new OracleParameter();
                pDireccion.Value = paciente.direccion;
                pDireccion.ParameterName = "p_direccion";

                OracleParameter pMail = new OracleParameter();
                pMail.Value = paciente.mail;
                pMail.ParameterName = "p_mail";

                OracleParameter pCelular = new OracleParameter();
                pCelular.DbType = DbType.Int32;
                pCelular.Value = paciente.celular;
                pCelular.ParameterName = "p_celular";

                OracleParameter pFechaNacimiento = new OracleParameter();

                pFechaNacimiento.Value = paciente.fechaNacimiento;
                pFechaNacimiento.ParameterName = "p_fechanacimiento";

                OracleParameter pHabitos = new OracleParameter();

                pHabitos.Value = paciente.habitos;
                pHabitos.ParameterName = "p_habitos";

                OracleParameter pObservaciones = new OracleParameter();

                pObservaciones.Value = paciente.observaciones;
                pObservaciones.ParameterName = "p_observaciones";

                OracleParameter pTratamientos = new OracleParameter();

                pTratamientos.Value = paciente.tratamientosPrevios;
                pTratamientos.ParameterName = "p_tratamientos";

                OracleParameter pNombreRep = new OracleParameter();

                pNombreRep.Value = paciente.nombreRepresentante;
                pNombreRep.ParameterName = "p_nombreRep";

                OracleParameter pRutRep = new OracleParameter();

                pRutRep.Value = paciente.rutRepresentante;
                pRutRep.ParameterName = "p_RutRep";

                OracleParameter pEstado = new OracleParameter();

                pEstado.Value = paciente.estado;
                pEstado.ParameterName = "p_Estado";



                cmdInsert.Parameters.Add(pRut);
                cmdInsert.Parameters.Add(pNombre);
                cmdInsert.Parameters.Add(pApellidos);
                cmdInsert.Parameters.Add(pSexo);
                cmdInsert.Parameters.Add(pTelefono);
                cmdInsert.Parameters.Add(pDireccion);
                cmdInsert.Parameters.Add(pMail);
                cmdInsert.Parameters.Add(pCelular);
                cmdInsert.Parameters.Add(pFechaNacimiento);
                cmdInsert.Parameters.Add(pHabitos);
                cmdInsert.Parameters.Add(pObservaciones);
                cmdInsert.Parameters.Add(pTratamientos);
                cmdInsert.Parameters.Add(pNombreRep);
                cmdInsert.Parameters.Add(pRutRep);

                cmdInsert.Parameters.Add(pEstado);
                try
                {
                    k = cmdInsert.ExecuteNonQuery();
                }
                catch (Exception e)
                {
                    Console.Write(e);
                }
                cmdInsert.Dispose();
                oraConn.Close();







            } return k;
        }

        public static int ModificarPaciente(Paciente paciente)
        {
            OracleConnection oraConn = new OracleConnection();
            int k = 0;
            string connString = "Server=XE;Uid=juan;Pwd=lagartija";
            if (oraConn.State != ConnectionState.Open)
            {
                try
                {
                    oraConn.ConnectionString = connString;

                    oraConn.Open();

                    Console.WriteLine(oraConn.ConnectionString, "Successful Connection");
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message, "Exception Caught");
                }
            }

            if (oraConn.State == ConnectionState.Open)
            {



              string sqlUpdate = "update paciente ";
                sqlUpdate += "set nombre = :p_nombre, ";
                sqlUpdate += "apellido = :p_apellidos, ";
                sqlUpdate += "sexo = :p_sexo, ";
                sqlUpdate += "telefono = :p_telefono, ";
                sqlUpdate += "direccion = :p_direccion, ";
                sqlUpdate += "mail = :p_mail, ";
                sqlUpdate += "celular = :p_celular, ";
                sqlUpdate += "fechanacimiento = :p_fechanacimiento, ";
                sqlUpdate += "habitos = :p_habitos, ";
                sqlUpdate += "observaciones = :p_observaciones, ";
                sqlUpdate += "tratamientosprevios = :p_tratamientos, ";
                sqlUpdate += "nombrerepresentante = :p_nomRep, ";
                sqlUpdate += "rutrepresentante = :p_RutRep, ";
                sqlUpdate += "estado = :p_Estado ";
                sqlUpdate += "where rutpaciente = :p_rut";

                OracleCommand cmdUpdate = new OracleCommand();
                cmdUpdate.CommandText = sqlUpdate;
                cmdUpdate.Connection = oraConn;

                

                OracleParameter pNombre = new OracleParameter();
                pNombre.Value = paciente.nombre;
                pNombre.ParameterName = "p_nombre";

                OracleParameter pApellidos = new OracleParameter();
                pApellidos.Value = paciente.apellidos;
                pApellidos.ParameterName = "p_apellidos";

                OracleParameter pSexo = new OracleParameter();
                pSexo.Value = paciente.sexo;
                pSexo.ParameterName = "p_sexo";

                OracleParameter pTelefono = new OracleParameter();
                pTelefono.OracleType = OracleType.Int32;               
                pTelefono.Value = Convert.ToInt32(paciente.telefono);
                pTelefono.ParameterName = "p_telefono";
               

                OracleParameter pDireccion = new OracleParameter();
                pDireccion.Value = paciente.direccion;
                pDireccion.ParameterName = "p_direccion";

                OracleParameter pMail = new OracleParameter();
                pMail.Value = paciente.mail;
                pMail.ParameterName = "p_mail";

                OracleParameter pCelular = new OracleParameter();
                pCelular.OracleType = OracleType.Int32;
                pCelular.Value = Convert.ToInt32(paciente.celular);
                pCelular.ParameterName = "p_celular";

                OracleParameter pFechaNacimiento = new OracleParameter();
                pFechaNacimiento.Value = paciente.fechaNacimiento;
                pFechaNacimiento.ParameterName = "p_fechanacimiento";

                OracleParameter pHabitos = new OracleParameter();
                pHabitos.Value = paciente.habitos;
                pHabitos.ParameterName = "p_habitos";

                OracleParameter pObservaciones = new OracleParameter();
                pObservaciones.Value = paciente.observaciones;
                pObservaciones.ParameterName = "p_observaciones";

                OracleParameter pTratamientos = new OracleParameter();
                pTratamientos.Value = paciente.tratamientosPrevios;
                pTratamientos.ParameterName = "p_tratamientos";

                OracleParameter pNombreRep = new OracleParameter();
                pNombreRep.Value = paciente.nombreRepresentante;
                pNombreRep.ParameterName = "p_nomRep";

                OracleParameter pRutRep = new OracleParameter();
                pRutRep.Value = paciente.rutRepresentante;
                pRutRep.ParameterName = "p_RutRep";

                OracleParameter pEstado = new OracleParameter();
                pEstado.Value = paciente.estado;
                pEstado.ParameterName = "p_Estado";

                OracleParameter pRut = new OracleParameter();
                pRut.Value = paciente.rut;
                pRut.ParameterName = "p_rut";

                
                cmdUpdate.Parameters.Add(pNombre);
                cmdUpdate.Parameters.Add(pApellidos);
                cmdUpdate.Parameters.Add(pSexo);
                cmdUpdate.Parameters.Add(pTelefono);
                cmdUpdate.Parameters.Add(pDireccion);
                cmdUpdate.Parameters.Add(pMail);
                cmdUpdate.Parameters.Add(pCelular);
                cmdUpdate.Parameters.Add(pFechaNacimiento);
                cmdUpdate.Parameters.Add(pHabitos);
                cmdUpdate.Parameters.Add(pObservaciones);
                cmdUpdate.Parameters.Add(pTratamientos);
                cmdUpdate.Parameters.Add(pNombreRep);
                cmdUpdate.Parameters.Add(pRutRep);
                cmdUpdate.Parameters.Add(pEstado);
                cmdUpdate.Parameters.Add(pRut);

                try{
     
                k=cmdUpdate.ExecuteNonQuery();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message, "Exception Caught");
                }
                cmdUpdate.Dispose();
            oraConn.Close();
                return k;
            }
            return k;


        }

        public static Paciente UltimoPago(string rut)
        {
            string sql = @" select	 MAX(PAGO.FECHA) as FECHA 
                              from	 PACIENTE PACIENTE,
                                   	 PRESUPUESTO PRESUPUESTO,
                                 	 PAGO PAGO 
                             where   PACIENTE.RUTPACIENTE=PRESUPUESTO.RUTPACIENTE
                               and	 PRESUPUESTO.ID_PRESUPUESTO=PAGO.ID_PRESUPUESTO
                               and 	 PACIENTE.RUTPACIENTE='"+rut+"'";



            Paciente paciente = null;


            OracleConnection Oraclecon = new OracleConnection("Server=XE;Uid=juan;Pwd=lagartija");
            Oraclecon.Open();
            OracleCommand myCMD = new OracleCommand();
            myCMD.Connection = Oraclecon;
            myCMD.CommandText = sql;
            myCMD.CommandType = CommandType.Text;

            OracleDataReader reader = myCMD.ExecuteReader();


            if (reader.Read())
            {
                paciente = LoadUltimoPagoPaciente(reader);
            }
            Oraclecon.Close();
            return paciente;
        }

        public static int SumaTratamientosEjec(string rut)
        {
          /*  string sql = @"  select	 SUM(PAGO.MONTO) AS MONTO 
                               from	 PACIENTE PACIENTE,
	                                 PRESUPUESTO PRESUPUESTO,
	                                 PAGO PAGO 
                              where  PACIENTE.RUTPACIENTE=PRESUPUESTO.RUTPACIENTE
                                and	 PRESUPUESTO.ID_PRESUPUESTO=PAGO.ID_PRESUPUESTO
                                and  PACIENTE.RUTPACIENTE='" + rut + "'";*/

            string sql = @"select sum(valor) as valor
                             from presupuesto, paciente
                            where presupuesto.estado='Ejecucion'
                              and PRESUPUESTO.RUTPACIENTE='"+rut+"'";



            int suma = 0;


            OracleConnection Oraclecon = new OracleConnection("Server=XE;Uid=juan;Pwd=lagartija");
            Oraclecon.Open();
            OracleCommand myCMD = new OracleCommand();
            myCMD.Connection = Oraclecon;
            myCMD.CommandText = sql;
            myCMD.CommandType = CommandType.Text;

            OracleDataReader reader = myCMD.ExecuteReader();


            if (reader.Read())
            {
                if (reader["valor"] != DBNull.Value)
                {
                    suma = Convert.ToInt32(reader["valor"]);
                }
            }
            Oraclecon.Close();
            return suma;
        }

        public static int SumaPagosEjec(string rut)
        {
            string sql = @"select sum(pago.monto) as pagado
                            from paciente, presupuesto, pago
                            where PACIENTE.RUTPACIENTE=PRESUPUESTO.RUTPACIENTE
                            and PRESUPUESTO.ID_PRESUPUESTO=PAGO.ID_PRESUPUESTO
                            and presupuesto.estado='Ejecucion'
                            and PACIENTE.RUTPACIENTE='"+rut+"'";



            int suma = 0;


            OracleConnection Oraclecon = new OracleConnection("Server=XE;Uid=juan;Pwd=lagartija");
            Oraclecon.Open();
            OracleCommand myCMD = new OracleCommand();
            myCMD.Connection = Oraclecon;
            myCMD.CommandText = sql;
            myCMD.CommandType = CommandType.Text;

            OracleDataReader reader = myCMD.ExecuteReader();


            if (reader.Read())
            {
                if (reader["pagado"] != DBNull.Value)
                {
                    suma = Convert.ToInt32(reader["pagado"]);
                }
            }
            Oraclecon.Close();
            return suma;
        }



        private static Paciente LoadDeudaPaciente(IDataReader reader)
        {
            Paciente paciente = new Paciente();

            if (reader["monto"] != DBNull.Value)
            {
                paciente.totaldeuda = Convert.ToInt32(reader["monto"]);
            }
            else { paciente.totaldeuda = 0; }
            return paciente;
        }

        private static Paciente LoadUltimoPagoPaciente(IDataReader reader)
        {
            Paciente paciente = new Paciente();

            if (reader["fecha"] != DBNull.Value)
                paciente.fechaultimopago = Convert.ToString(reader["fecha"]).Substring(0,10);
            else
                paciente.fechaultimopago = "No posee";
            return paciente;
        }
    }
}